import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;

/**
 * Estah funcionando para os testes, mas nao passou no site
 * 
 * Esse numero pra base 10 nao acaba nunca: 9073939
 * 
 */
public class Main290 {

	private static List<Character> simbolos = Arrays.asList('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E');

	public static void main(String args[]) {

		Scanner sc = new Scanner(System.in);

		while (sc.hasNextLine()) {

			String entrada = sc.nextLine();
			
			boolean baseEhValida = true;

			for (int base = 15; base >= 2; base--) {
				
				String numero = entrada;
				
				// verifica se a entrada pode ser representada na base
				for (int algarismo = 0; algarismo < entrada.length(); algarismo++) {

					if (simbolos.indexOf(entrada.charAt(algarismo)) >= base) {

						System.out.print("?");

						if (base != 2) {
							System.out.print(" ");
						}

						baseEhValida = false;
						break;
					}
				}

				int quantidadePassos = 0;

				if (baseEhValida) {
					
					while (!ehPalindromo(numero)) {

						numero = soma(base, numero, palindromo(numero));
						quantidadePassos++;
						
					}

					System.out.print(quantidadePassos);

					if (base != 2) {
						System.out.print(" ");
					} 
				}
			}
			System.out.println();
		}
	}

	private static String palindromo(String entrada) {

		String resultado = "";

		for (int i = entrada.length() - 1; i >= 0; i--) {
			resultado += entrada.charAt(i);
		}

		return resultado;
	}

	private static String soma(int base, String n1, String n2) {

		String resultado = "";

		int posicaoVaiUm = 0;

		String[] n1n2Ajustados = getN1eN2Ajustados(n1, n2);

		n1 = n1n2Ajustados[0];
		n2 = n1n2Ajustados[1];

		for (int i = n1.length() - 1; i >= 0; i--) {

			char a = n1.charAt(i);
			char b = n2.charAt(i);

			int posicaoA = Character.getNumericValue(simbolos.get(Character.getNumericValue(a)));
			int posicaoB = Character.getNumericValue(simbolos.get(Character.getNumericValue(b)));

			int soma = posicaoA + posicaoB + Character.getNumericValue(simbolos.get(posicaoVaiUm));

			posicaoVaiUm = soma / base;
			int posicaoFica = soma % base;

			resultado = simbolos.get(posicaoFica) + resultado;

		}

		int vaiUm = Character.getNumericValue(simbolos.get(posicaoVaiUm));
		if (vaiUm == 0) {
			return resultado;
		} else {
			return Character.getNumericValue(simbolos.get(posicaoVaiUm)) + resultado;
		}

	}

	private static String[] getN1eN2Ajustados(String n1, String n2) {

		int tamN1 = n1.length();
		int tamN2 = n2.length();

		String zeros = "";

		if (tamN1 > tamN2) {

			for (int i = 0; i < tamN1 - tamN2; i++) {
				zeros += "0";
			}

			return new String[] { n1, zeros + n2 };

		} else {

			for (int i = 0; i < tamN2 - tamN1; i++) {
				zeros += "0";
			}

			return new String[] { zeros + n1, n2 };

		}

	}

	private static boolean ehPalindromo(String s) {

		for (int i = 0; i < s.length() / 2; i++) {
			if (s.charAt(i) != s.charAt(s.length() - 1 - i)) {
				return false;
			}
		}
		return true;
	}
}
